package org.nobody.mallb2c.mallorder.config;

import com.rabbitmq.client.Channel;
import org.nobody.mallb2c.mallorder.entity.OrderEntity;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 3489309323@qq.com
 * @create 2020-09-25-13:25
 */
@Configuration
public class MyMQConfig {
  //@Bean Binding、Queue、Exchange
  //spring中只要我们将上面三个以bean的方式注入,spring就会帮我们自动连上mq并创建其中没有的元素
  //但需要注意的是 即使这些mq元素在这里配置的属性发生变化 spring也不会帮我们重新创建
  //需要手动在mq里删除 再重新启动spring

  /*@RabbitListener(queues = "order.release.order.queue")
  public void listener(OrderEntity entity, Channel channel, Message message) throws IOException {
    System.out.println("收到过期的订单信息: 准备关闭订单" + entity.getOrderSn());
    channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
  }*/

  @Bean
  public Queue orderDelayQueue(){
    Map<String, Object> arguments = new HashMap<>();
    arguments.put("x-dead-letter-exchange", "order-event-exchange");
    arguments.put("x-dead-letter-routing-key", "order.release.order");
    arguments.put("x-message-ttl", 120000); //todo
    Queue queue = new Queue("order.delay.queue", true, false, false, arguments);
    return queue;
  }

  @Bean
  public Queue orderReleaseOrderQueue(){
    Queue queue = new Queue("order.release.order.queue", true, false, false);
    return queue;
  }

  @Bean
  public Exchange orderEventExchange(){
    return new TopicExchange("order-event-exchange",true,false);
  }

  @Bean
  public Binding orderCreateOrderBinding(){
    return new Binding(
      "order.delay.queue",
      Binding.DestinationType.QUEUE,
      "order-event-exchange",
      "order.create.order",
      null
    );
  }

  @Bean
  public Binding orderReleaseOrderBinding(){
    return new Binding(
      "order.release.order.queue",
      Binding.DestinationType.QUEUE,
      "order-event-exchange",
      "order.release.order",
      null
    );
  }


  @Bean
  public Binding orderReleaseOtherBinding(){
    return new Binding(
      "stock.release.stock.queue",
      Binding.DestinationType.QUEUE,
      "order-event-exchange",
      "order.release.other.#",
      null
    );
  }

  @Bean
  public Queue orderSeckillOrderQueue(){
    return new Queue("order.seckill.order.queue", true, false, false);
  }

  @Bean
  public Binding orderSeckillOrderQueueBinding(){
    return new Binding(
      "order.seckill.order.queue", Binding.DestinationType.QUEUE,
      "order-event-exchange",
      "order.seckill.order",
      null
    );
  }
}
